package ar.uba.fi.celdas.ponderador.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.mockito.Mockito;

import ar.fi.uba.celdas.interfaces.ambiente.IAccion;
import ar.fi.uba.celdas.interfaces.bc.IBaseConocimientos;
import ar.fi.uba.celdas.interfaces.bc.Regla;
import ar.fi.uba.celdas.interfaces.bc.Sensor;
import ar.uba.fi.celdas.ponderador.Ponderador;

public class PruebaPonderadorMock {

	public static void main(String[] args) {
	
		
		Regla regla1 = crearReglaMock("accion1", 1, 4, 0);
		
		Regla regla2 =  crearReglaMock("accion2", 1, 1, 0);
		
		List<Regla> plan= new ArrayList<Regla>();
		plan.add(regla1);
		plan.add(regla2);
		

		
		//ponderador
		Ponderador ponderador = new Ponderador();
		ponderador.ponderar(plan, crearBaseDeConocimientoMock());
	}
	
	private static Regla crearReglaMock(String nombreAccion, int P,int K,int utilidad){
		IAccion accion1= Mockito.mock(IAccion.class);
		Mockito.when(accion1.getNombre()).thenReturn(nombreAccion);
		
		List<IAccion> listaAcciones1=new ArrayList<IAccion>();
		listaAcciones1.add(accion1);
		
		Regla regla1 = Mockito.mock(Regla.class);
		Mockito.when(regla1.getAcciones()).thenReturn(listaAcciones1);
		
		Mockito.when(regla1.getExitos()).thenReturn(P);
		Mockito.when(regla1.getUso()).thenReturn(K);
		Mockito.when(regla1.getUtilidad()).thenReturn(0);

		return regla1;
	}
	
	/**
	 * Crea una sitacion definida simplemente por un sensor y un valor
	 * @param nombre
	 * @param valor
	 * @return
	 */
	private static Collection<Sensor> crearSituacion(String nombre, int valor){
		ArrayList<Sensor> situacion=new ArrayList<Sensor>();
		situacion.add(new Sensor(nombre, valor));
		return situacion;
	}
	
	private static IBaseConocimientos crearBaseDeConocimientoMock(){
		IBaseConocimientos base = Mockito.mock(IBaseConocimientos.class);
		List<Regla> reglas = new ArrayList<Regla>();
		
		Collection<Sensor> situacion1= crearSituacion("sensor1", 0);
		Collection<Sensor> situacion2= crearSituacion("sensor2", 0);
		Collection<Sensor> situacion3= crearSituacion("sensor3", 0);
		Collection<Sensor> situacion4= crearSituacion("sensor4", 0);
		Collection<Sensor> situacion5= crearSituacion("sensor5", 0);
		
		Regla regla31 = crearReglaMock("accion1", 3, 3, 0);
		Regla regla12 = crearReglaMock("accion1", 3, 4, 0);
		Regla regla14 = crearReglaMock("accion1", 1, 4, 0);
		Regla regla42 = crearReglaMock("accion2", 1, 1, 0);
		Regla regla54 = crearReglaMock("accion1", 1, 1, 0);
		Regla regla23 = crearReglaMock("accion2", 3, 4, 0);
		Regla regla25 = crearReglaMock("accion2", 1, 4, 0);
		
		Mockito.when(regla31.getCondiciones()).thenReturn(situacion3);
		Mockito.when(regla31.getPredicciones()).thenReturn(situacion1);
		
		Mockito.when(regla12.getCondiciones()).thenReturn(situacion1);
		Mockito.when(regla12.getPredicciones()).thenReturn(situacion2);
		
		Mockito.when(regla14.getCondiciones()).thenReturn(situacion1);
		Mockito.when(regla14.getPredicciones()).thenReturn(situacion4);
		
		Mockito.when(regla42.getCondiciones()).thenReturn(situacion4);
		Mockito.when(regla42.getPredicciones()).thenReturn(situacion2);
		
		Mockito.when(regla54.getCondiciones()).thenReturn(situacion5);
		Mockito.when(regla54.getPredicciones()).thenReturn(situacion4);
		
		Mockito.when(regla23.getCondiciones()).thenReturn(situacion2);
		Mockito.when(regla23.getPredicciones()).thenReturn(situacion3);
		
		Mockito.when(regla25.getCondiciones()).thenReturn(situacion2);
		Mockito.when(regla25.getPredicciones()).thenReturn(situacion5);
		
		reglas.add(regla31);
		reglas.add(regla12);
		reglas.add(regla14);
		reglas.add(regla42);
		reglas.add(regla54);
		reglas.add(regla23);
		reglas.add(regla25);
		
		Mockito.when(base.getReglas()).thenReturn(reglas);
		
		return base;
		
	}
}
